home *** CD-ROM | disk | FTP | other *** search
/ Games of Daze / Infomagic - Games of Daze (Summer 1995) (Disc 1 of 2).iso / x2ftp / msdos / libs / knowhow4 / grafic.cpp < prev    next >
C/C++ Source or Header  |  1994-11-19  |  10KB  |  338 lines

  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include "grafic.h"
  4.  
  5. GrafData::GrafData(char a, char b, int m_t, int l_t, int s, int f, int* d_x,
  6.                    int* d_y, int n_p, char* fName)
  7.     {
  8.     graf = new Graf(m_t, l_t, a, b, s, f);
  9.     data_x = d_x;
  10.     data_y = d_y;
  11.     num_points = n_p;
  12.     fileName = strdup(fName);
  13.     }
  14.  
  15. //////////
  16. GrafData::~GrafData()
  17.     {
  18.     delete graf;
  19.     delete data_x;
  20.     delete data_y;
  21.     unlink(fileName);
  22.     delete fileName;
  23.     }
  24. //////////////////////////////
  25. void GrafData::load()
  26.     {
  27.     FILE* f = fopen(fileName, "rb");
  28.  
  29.     fread((void*)num_points, sizeof(int), 1, f);
  30.     delete data_x;
  31.     data_x = new int[num_points];
  32.     delete data_y;
  33.     data_y = new int[num_points];
  34.     fread(data_x, sizeof(int) * num_points, 1, f);
  35.     fread(data_y, sizeof(int) * num_points, 1, f);
  36.     fclose(f);
  37.     }
  38. //////////////////////////////
  39. void GrafData::save()
  40.     {
  41.     FILE* f = fopen(fileName, "wb");
  42.  
  43.     fwrite((void*)num_points, sizeof(int), 1, f);
  44.     fwrite(data_x, sizeof(int) * num_points, 1, f);
  45.     fwrite(data_y, sizeof(int) * num_points, 1, f);
  46.     delete data_x; data_x = NULL;
  47.     delete data_y; data_y = NULL;
  48.     fclose(f);
  49.     }
  50. //////////////////////////////
  51. Grafic::Grafic(rect r, int ax, int lab, int g, int save)
  52.         : Axes2()
  53.     {
  54.     coord = r;
  55.     ax_col = ax;
  56.     lab_col = lab;
  57.  
  58.     char fileName[20];
  59.     for(int i = 0; i < 15; i++)
  60.         {
  61.         if(!save)
  62.             fileName[0] = '\0';
  63.         else
  64.             itoa(i, fileName, 10);
  65.  
  66.     arrays[i] = new GrafData(RED, BLUE, BAR, LINE_GRAF, 4, SOLID_FILL,
  67.              NULL, NULL, 0, fileName);
  68.         }
  69.     used = 0;
  70.     grid_style = g;
  71.     }
  72. /////////////////////////
  73. Grafic::~Grafic()
  74.     {
  75.     for(int i = 0; i < 15; i++)
  76.     delete arrays[i];
  77.     }
  78. /////////////////////////
  79. loc Grafic::get_zero(double xmin, double ymin, double xmax, double ymax)
  80.     {
  81.     int x, y;
  82.     zero_x = xmin;
  83.     zero_y = ymin;
  84.     if(xmax < 0)
  85.         x = work_coord.corner.X;
  86.     else if(xmin > 0)
  87.         x = work_coord.origin.X;
  88.     else
  89.         {
  90.     x = work_coord.origin.X - work_coord.width() * xmin / (xmax - xmin);
  91.         zero_x = 0;
  92.         }
  93.     if(ymax < 0)
  94.         y = work_coord.corner.Y;
  95.     else if(ymin > 0)
  96.         y = work_coord.origin.Y;
  97.     else
  98.         {
  99.     y = work_coord.corner.Y + work_coord.height() * ymin / (ymax - ymin);
  100.         zero_y = 0;
  101.         }
  102.     len_x = xmax - xmin;
  103.     len_y = ymax - ymin;
  104.     return zero = loc(x, y);
  105.     }
  106. /////////////////////////
  107. /* Bar width calculation: we want to draw bar graf with width < than
  108.        is necessary to draw bars side-by side. We must calculate
  109.        WIDTH = WIDTH_OF_X_AXE / Total number of bars (in all grafs,
  110.        not only in current) * 3 / 4
  111.    The width of staked bar graf not depends from another grafs.
  112. */
  113. int Grafic::bar_width()
  114.     {
  115.     int num = 0;
  116.     if(arrays[0]->graf->line_type == STACKED_BAR_GRAF)
  117.         {
  118.     for(int i = 0; i < used - 1; i++)
  119.             num = arrays[i]->num_points > num
  120.             ? arrays[i]->num_points : num;
  121.         }
  122.     else
  123.         for(int i = 0; i < used; i++)
  124.             {
  125.             if(arrays[i]->graf->line_type == BAR_GRAF
  126.             || arrays[i]->graf->line_type == BAR_3D_GRAF)
  127.                 num += arrays[i]->num_points;
  128.         }
  129.     return num == 0 ? 0 : 3 * work_coord.width() / num / 8;
  130.     }
  131. //////////////////////////
  132. void Grafic::get_x_array(int ar, int num, double* data)
  133.     {
  134.     if(arrays[ar]->data_x == NULL)
  135.         used++;
  136.     delete arrays[ar]->data_x;
  137.     arrays[ar]->data_x = new int[num];
  138.     for(int i = 0; i < num; i++)
  139.         {
  140.     arrays[ar]->data_x[i]
  141.         = work_coord.width() * (data[i] - zero_x) / len_x;
  142.         }
  143.     arrays[ar]->num_points = num;
  144.     }
  145. //////////////////////////
  146. void Grafic::get_y_array(int ar, int num, double* data)
  147.     {
  148.     delete arrays[ar]->data_y;
  149.     arrays[ar]->data_y = new int[num];
  150.     for(int i = 0; i < num; i++)
  151.         {
  152.     arrays[ar]->data_y[i]
  153.         = work_coord.height() * (data[i] - zero_y) / len_y;
  154.         }
  155.     }
  156. //////////////////////////
  157. int* Grafic::get_stacked(int n)
  158.     {
  159.     int* a = new int[1000];
  160.     for(int k = 0; k < 1000; k++)
  161.         a[k] = 0;
  162.     for(int j = 0; j < arrays[0]->num_points; j++)
  163.         {
  164.         int i = 0;
  165.         for(i = 0; i < n; i++)
  166.             {
  167.             if(arrays[i]->data_y[j] < 0)
  168.                 a[4 * j] += arrays[i]->data_y[j];
  169.             else
  170.             a[4 * j + 1] += arrays[i]->data_y[j];
  171.             }
  172.         if(arrays[i]->data_y[j] < 0)
  173.             a[4 * j + 2] = a[4 * j] + arrays[n]->data_y[j];
  174.         else
  175.             a[4 * j + 3] = a[4 * j + 1] + arrays[n]->data_y[j];
  176.         }
  177.  
  178.     return a;
  179.     }
  180. //////////////////////////
  181. void Grafic::show_axes()
  182.     {
  183.     Axes2::cross(work_coord, zero);
  184.     Axes2::show(work_coord.origin, ax_col, lab_col);
  185.     }
  186. ////////////////////////////
  187. void Grafic::grid()
  188.     {
  189.     setcolor(ax_col);
  190.     if(grid_style == 5)
  191.         return;
  192.     drawTool->setlinestyle(grid_style, 1, 1);
  193.     for(int i = 0; i < horiz_axe->sub_ticks_no; i++)
  194.     drawTool->line(work_coord.origin.X + (long)horiz_axe->sub_ticks[i]
  195.         * horiz_axe->len_scr / 10000, //horiz_axe->ticks[horiz_axe->ticks_no - 1],
  196.          work_coord.origin.Y,
  197.          work_coord.origin.X + (long)horiz_axe->sub_ticks[i]
  198.         * horiz_axe->len_scr / 10000, //horiz_axe->ticks[horiz_axe->ticks_no - 1],
  199.          work_coord.corner.Y);
  200.     for(i = 0; i < vert_axe->sub_ticks_no; i++)
  201.     drawTool->line(work_coord.origin.X,
  202.          work_coord.origin.Y + vert_axe->len_scr
  203.          - (long)vert_axe->sub_ticks[i]
  204.         * vert_axe->len_scr / 10000, //vert_axe->ticks[vert_axe->ticks_no - 1],
  205.          work_coord.corner.X,
  206.          work_coord.origin.Y + vert_axe->len_scr
  207.          - (long)vert_axe->sub_ticks[i]
  208.         * vert_axe->len_scr / 10000); //vert_axe->ticks[vert_axe->ticks_no - 1]);
  209.     }
  210. ////////////////////////////
  211. /*
  212. #include <conio.h>
  213.  
  214. void main()
  215.     {
  216.     int gdriver = DETECT, gmode;
  217.     initgraph(&gdriver, &gmode, "");
  218.  
  219.     drawTool = new KH_Paint();   // See KHPAINT.H
  220.     drawTool->rotate(loc(320, 240), 15);
  221.  
  222.     static int t[] = { 0, 5000, 10000 };
  223.     static int s[] = { 1111,  2222, 3333, 4444, 5555, 6666, 7777, 8888 };
  224.     static char* lab[] = { "First", "Second", "Third" };
  225.  
  226.     setfillstyle(SOLID_FILL, WHITE);
  227.     bar(0, 0, 639, 479);
  228.     rect rc = rect(5, 5, 639, 479);
  229.     rectangle(5, 5, 639, 479);
  230.     Grafic a(rc, BLUE, GREEN, 2, 1);
  231.  
  232.     rect r = a.set_work_rect(rect(90, 50, 450, 250));
  233.  
  234.     // Auto calc ticks and sub_ticks
  235.     a.set_axe(HORIZ1, r.width() - 1, -1.00, 1.00, 5, NULL);
  236.     a.set_axe(HORIZ2, r.width() - 1, 0, 0, 3, t, 8, s, lab);
  237.     // Auto calc ticks and pass array of sub_ticks
  238.     a.set_axe(VERT1, r.height() - 1, -500, 600, 10, NULL, 8, s);
  239.  
  240.     a.set_axe(VERT2, r.height() - 1, 0, 0, 3, t, 8, s, lab);
  241.  
  242.     loc z = a.get_zero(-1.00, -500, 1.00, 600);
  243.  
  244.     a.grid();
  245.     setcolor(BLACK);     // FOR CROSS
  246.     a.show_axes();
  247.  
  248.     static double x_ar[] = { -.80, -.60, -.40, -.20, 0, .20, .40, .60, .80 };
  249.     static double y1_ar[] = { -200, -150, -100, -50, 0, 50, 100, 150, 200 };
  250.     static double y2_ar[] = { -100, 100, -20, -5, 19, 100, 200, 100, 100 };
  251.  
  252.     a.get_x_array(0, 9, x_ar);
  253.     a.get_y_array(0, 9, y1_ar);
  254.     a.get_x_array(1, 9, x_ar);
  255.     a.get_y_array(1, 9, y2_ar);
  256.     a.get_x_array(2, 9, x_ar);
  257.     a.get_y_array(2, 9, y2_ar);
  258.  
  259.     a.arrays[0]->graf->set_type(BAR, STACKED_BAR_GRAF);
  260.     a.arrays[1]->graf->set_type(BAR, STACKED_BAR_GRAF);
  261.     a.arrays[2]->graf->set_type(BAR, STACKED_BAR_GRAF);
  262.  
  263.     int w = a.bar_width();
  264.     a.arrays[0]->graf->set_param(RED, GREEN, w,
  265.     SLASH_FILL);
  266.     a.arrays[1]->graf->set_param(RED, CYAN, w,
  267.     LINE_FILL);
  268.     a.arrays[2]->graf->set_param(RED, RED, w,
  269.     XHATCH_FILL);
  270.  
  271.     int* array = a.get_stacked(0);
  272.     a.arrays[0]->graf->show(a.arrays[0]->data_x, array, 9,
  273.     z.X, z.Y);
  274.     delete array;
  275.     array = a.get_stacked(1);
  276.     a.arrays[1]->graf->show(a.arrays[1]->data_x, array, 9,
  277.     z.X,  z.Y);
  278.     delete array;
  279.     array = a.get_stacked(2);
  280.     a.arrays[2]->graf->show(a.arrays[2]->data_x, array, 9,
  281.     z.X,  z.Y);
  282.     delete array;
  283.  
  284.     getch();
  285.     setfillstyle(SOLID_FILL, WHITE);
  286.     setviewport(0, 0, getmaxx(), getmaxy(), 1);
  287.     bar(0, 0, 639, 479);
  288.  
  289. //    drawTool->rotate(loc(200,200), 45);
  290.     drawTool->rotate(loc(320, 240), 15);
  291.     Grafic a1(rc, BLUE, GREEN, 2, 1);
  292.  
  293.  
  294.     r = a1.set_work_rect(rect(100, 100, 300, 300));
  295.  
  296.     a1.set_axe(HORIZ1, r.width() - 1, -1.00, 1.00, 5, NULL, 0, NULL,
  297.     NULL, VERT_DIR);
  298.     a1.set_axe(HORIZ2, r.width() - 1, 0, 0, 3, t, 8, s, lab);
  299.     a1.set_axe(VERT1, r.height() - 1, -300, 300, 10, NULL, 0, NULL);
  300.     a1.set_axe(VERT2, r.height() - 1, 0, 0, 3, t, 8, s, lab);
  301.  
  302.     z = a1.get_zero(-1.00, -300, 1.00, 300);
  303.  
  304.     a1.grid();
  305.     setcolor(BLACK);     // FOR CROSS
  306.     a1.show_axes();
  307.  
  308.     a1.get_x_array(0, 9, x_ar);
  309.     a1.get_y_array(0, 9, y1_ar);
  310.     a1.get_x_array(1, 9, x_ar);
  311.     a1.get_y_array(1, 9, y2_ar);
  312.     a1.get_x_array(2, 9, x_ar);
  313.     a1.get_y_array(2, 9, y1_ar);
  314.  
  315.     a1.arrays[0]->graf->set_type(BAR, COMBINED_GRAF);
  316.     a1.arrays[1]->graf->set_type(CIRCLE, BAR_3D_GRAF);
  317.     a1.arrays[2]->graf->set_type(TRIANGLE, BAR_3D_GRAF);
  318.  
  319.     w = a1.bar_width();
  320.     a1.arrays[0]->graf->set_param(RED, GREEN, w,
  321.     SLASH_FILL);
  322.     a1.arrays[1]->graf->set_param(RED, CYAN, w,
  323.     LINE_FILL);
  324.     a1.arrays[2]->graf->set_param(RED, RED, w,
  325.     XHATCH_FILL);
  326.  
  327.     a1.arrays[0]->graf->show(a1.arrays[0]->data_x, a1.arrays[0]->data_y, 9,
  328.     z.X, z.Y, 0);
  329.     a1.arrays[1]->graf->show(a1.arrays[1]->data_x, a1.arrays[1]->data_y, 9,
  330.     z.X,  z.Y, 1);
  331.     a1.arrays[2]->graf->show(a1.arrays[2]->data_x, a1.arrays[2]->data_y, 9,
  332.     z.X,  z.Y, 2);
  333.  
  334.     delete drawTool;   // See KHPAINT.H
  335.     getch();
  336.     closegraph();
  337.     }
  338. */